/**
 * 智学Web应用 - API服务层
 * 
 * 这个文件封装了所有与后端API的通信逻辑，
 * 提供了统一的接口调用方法，便于维护和管理。
 */

// API基础配置
const API_CONFIG = {
  baseURL: 'http://localhost:3000/api',
  timeout: 10000, // 10秒超时
  headers: {
    'Content-Type': 'application/json',
  }
};

/**
 * 通用的请求函数
 * 封装了fetch，添加了错误处理和超时机制
 */
async function request(endpoint: string, options: RequestInit = {}) {
  const url = `${API_CONFIG.baseURL}${endpoint}`;
  const config = {
    ...options,
    headers: {
      ...API_CONFIG.headers,
      ...options.headers,
    },
  };

  try {
    // 创建超时Promise
    const timeoutPromise = new Promise((_, reject) => {
      setTimeout(() => reject(new Error('请求超时')), API_CONFIG.timeout);
    });

    // 并行执行fetch请求和超时计时
    const response = await Promise.race([
      fetch(url, config),
      timeoutPromise
    ]) as Response;

    // 检查响应状态
    if (!response.ok) {
      throw new Error(`HTTP错误: ${response.status} ${response.statusText}`);
    }

    // 解析响应数据
    const data = await response.json();
    
    // 检查业务逻辑错误
    if (!data.success) {
      throw new Error(data.message || '请求失败');
    }

    return data;
  } catch (error) {
    // 统一的错误处理
    console.error(`API请求失败 [${url}]:`, error);
    
    // 根据错误类型提供友好的错误信息
    if (error instanceof Error) {
      if (error.message.includes('Failed to fetch')) {
        throw new Error('网络连接失败，请检查服务器是否运行');
      } else if (error.message.includes('timeout')) {
        throw new Error('请求超时，请稍后重试');
      } else {
        throw error;
      }
    }
    
    throw new Error('未知错误');
  }
}

/**
 * 学科相关的API接口
 */
export const subjectAPI = {
  /**
   * 获取学科列表
   * @returns 学科列表数据
   */
  async getSubjects() {
    const data = await request('/subjects');
    return data.data; // 返回data字段中的学科数据
  },

  /**
   * 根据ID获取单个学科详情
   * @param id 学科ID
   * @returns 学科详情数据
   */
  async getSubjectById(id: number) {
    const data = await request(`/subjects/${id}`);
    return data.data;
  },

  /**
   * 创建新学科（管理员功能）
   * @param subjectData 学科数据
   * @returns 创建的学科数据
   */
  async createSubject(subjectData: unknown) {
    const data = await request('/subjects', {
      method: 'POST',
      body: JSON.stringify(subjectData),
    });
    return data.data;
  },

  /**
   * 更新学科信息（管理员功能）
   * @param id 学科ID
   * @param subjectData 更新的学科数据
   * @returns 更新后的学科数据
   */
  async updateSubject(id: number, subjectData: unknown) {
    const data = await request(`/subjects/${id}`, {
      method: 'PUT',
      body: JSON.stringify(subjectData),
    });
    return data.data;
  },

  /**
   * 删除学科（管理员功能）
   * @param id 学科ID
   * @returns 删除成功信息
   */
  async deleteSubject(id: number) {
    const data = await request(`/subjects/${id}`, {
      method: 'DELETE',
    });
    return data;
  }
};

/**
 * 其他API接口可以在这里继续添加
 * 例如：
 * export const courseAPI = { ... }
 * export const userAPI = { ... }
 * export const studyPlanAPI = { ... }
 */

// 导出类型定义（后续可以完善）
export interface Subject {
  id: number;
  name: string;
  code: string;
  description: string;
  color: string;
  icon: string;
  sort_order: number;
  status: number;
  created_at: string;
  updated_at: string;
}

export interface ApiResponse<T = unknown> {
  success: boolean;
  data: T;
  message?: string;
  error?: string;
}

/**
 * 小白注释：为了让两种导入方式都能用
 * 做了什么：同时提供“具名导出”和“默认导出”。
 * 怎么用：
 *  - 具名：import { subjectAPI } from '../services/api'
 *  - 默认：import subjectAPI from '../services/api'
 * 这样可以避免编辑器偶尔提示“没有导出的成员 subjectAPI”。
 */
export default subjectAPI